<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 面向对象的编程特点：封装，继承 多态。
        // 在JS中我们可以使用原型链来实现继承
        // 通过在子对象中重写父对象的方法来实现多态
        
        /*
        value : 指定值
        writable : 标识当前属性值是否是可修改的, 默认为 false
        configurable：标识当前属性是否可以被删除 默认为 false
        enumerable：标识当前属性是否能用for in 枚举 默认为 false
        get:   当获取当前属性时的回调函数
        set:   当设置当前属性时
        */

        // 定义一个人person对象,
        // 通过Object.create(), 可以为下面对象添加一个特殊属性 city
        //var person = new Object();
        var person = Object.create(Object.prototype, {
            city:{
                value:"西安",
                writable:false, // 设置是否可以修改，默认false
                configurable:false, // 设置是否可以删除 默认false
                enumerable:false,   // 设置对象的属性是否可以遍历（for in）默认false
            },
            age:{
                // 当获取age属性时，此方法自动调用
                get: function(){     
                    //return "保密"; //this._age;
                    return this._age;
                },
                // 当为age属性赋值，此方法自动调用
                set: function(m){
                    if(m < 18 || m > 60){
                        console.error("年龄非法赋值");
                        return;
                    }
                    this._age = m;
                }
            }
        });
        // 为对象添加普通属性
        person.name = "zhangsan";
        person.sex = "man";

        // 使用对象
        console.log(person);
        console.log(person.name, person.sex);
        person.sex = "woman"; // 修改普通属性，可以修改
        delete person.name; // 删除普通属性，可以删除
        person.city = "成都"; // 修改特殊属性，默认不可以
        delete person.city; // 删除特殊属性，默认不可以
        console.log(person);
        console.log(person.city);

        person.age = 20;
        person.age = 12;
        console.log(person.age);


        /*
        // 声明一个对象
        var ob = {
            name:"zhangsan"
        };

        // 以ob为原型对象添加属性,并返回一个新对象
        var obb =  Object.create(ob,{
            // 添加一个属性，并在此属性中设置它的权限
            age:{
                value:20,
                writable:false, // 设置是否可以修改
                configurable:true, // 设置是否可以删除
                enumerable:true,   // 设置对象的属性是否可以遍历（for in）
            },
            sex:{
                value:"男",
                writable:true, // 设置是否可以修改
                configurable:true, // 设置是否可以删除
                enumerable:true,   // 设置对象的属性是否可以遍历（for in）
            },
       });

       console.log(obb);
       // 修改obb的age属性
       obb.age = 22; // 默认此属性不可修改
      // delete obb.age; // 尝试删除对象的属性，默认不可删除
       console.log(obb.name, obb.age);
       
       // 使用for in遍历对象的属性
       for(var k in obb){
          console.log(k);
       }

       */


    </script>
</body>
</html>